package com.taotao.antlr4;

import com.taotao.antlr4.sql.RuleSetBaseVisitor;
import com.taotao.antlr4.sql.RuleSetParser;

public class MyRuleSetVisitor extends RuleSetBaseVisitor<Double> {

    @Override
    public Double visitMul(RuleSetParser.MulContext ctx) {
        // 乘号左边的calcu语法，
        // 它可能是一组带括号或不带括号甲减乘除运算，也可能是一个数字
        // 直接visit即可访问它的处理方法拿到最终返回结果
        double left = visit(ctx.calcu(0));
        // 乘号右边的calcu语法，与左侧相同
        double right = visit(ctx.calcu(1));
        return left * right;
    }

    @Override
    public Double visitDiv(RuleSetParser.DivContext ctx) {
        double left = visit(ctx.calcu(0));
        double right = visit(ctx.calcu(1));
        return left / right;
    }

    @Override
    public Double visitAdd(RuleSetParser.AddContext ctx) {
        double left = visit(ctx.calcu(0));
        double right = visit(ctx.calcu(1));
        return left + right;
    }

    @Override
    public Double visitSub(RuleSetParser.SubContext ctx) {
        double left = visit(ctx.calcu(0));
        double right = visit(ctx.calcu(1));
        return left - right;
    }

    @Override
    public Double visitNumber(RuleSetParser.NumberContext ctx) {
        // NUMBER词法直接转为double
        return Double.parseDouble(ctx.getText());
    }

    @Override
    public Double visitParens(RuleSetParser.ParensContext ctx) {
        return visit(ctx.calcu());
    }
}